package com.yc.jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author zwei
 * @create 2024-08-03 14:46
 */
public class CheckRightsInvocationHandler implements InvocationHandler {
    private Object target;  //目标对象

    //目标类的引用初始化
    public CheckRightsInvocationHandler(Object target) {
        this.target = target;
    }

    //对外提供一个方法用于创建一个代理对象
    public Object createProxy() {
        //jdk中提供了一个Proxy.newProxyInstance方法来创建代理类对象
        Object proxy = Proxy.newProxyInstance(CheckRightsInvocationHandler.class.getClassLoader(), target.getClass().getInterfaces(), this);
        //this表明：一个代理对象被调用时  由jvm自动回调this的invocationHandler的invoke方法
        return proxy;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //1.什么时候调用增强
        if (method.getName().startsWith("show") ||
                method.getName().startsWith("save") ||
                method.getName().startsWith("update") ){
            checkRights();
        }
        //2.调用目标方法
        Object result = method.invoke(target, args);    //target.method(target)
        if (method.getName().startsWith("show") ||
                method.getName().startsWith("save") ||
                method.getName().startsWith("update") ){
            recordLog();
        }
        return result;
    }

    private void recordLog() {
        System.out.println("权限验证");
    }

    private void checkRights() {
        System.out.println("日志记录");
    }
}
